#!/usr/bin/perl
#si pas le même redpertoire mettre -I a l'appelle de perl suivi du repertoire avec les packages
use strict;
use warnings;
use p_files_with_eval_manager;
use p_index_manager;
use constant NB_CLASSE => 4;

#fonction pour connaitre la case où est le max
sub where_is_the_max{
	if(!exists($_[0][0])){
		return -1;
	}
	my $cpt=0;
	my $max=0;
	while(exists($_[0][$cpt])){
		#print"$_[0][$cpt],\t";
		if($_[0][$cpt]>$_[0][$max]){
			$max=$cpt;
		}
		$cpt++;
	}
	#print"max:$max\n";
	return $max;
}

my $renewIndex = 0;
my $renewEval = 0;
if(exists($ARGV[2])){
	my $cpt=2;
	while(exists($ARGV[$cpt])){
		if($ARGV[$cpt] eq "--renewIndex"){
			$renewIndex=1;
		}elsif($ARGV[$cpt] eq "--renewEval"){
			$renewEval=1;
		}
		$cpt++;
	}
}

if(!exists($ARGV[0])){
	die("Mauvaise utilisation de 1.2-system_de_base.perl, vous devez spécifier le corpus de travail\n");
}
my $nbPartition;
if(!exists($ARGV[1])){
	print "Nombre de partition mise par défaut à\t10\n";
	$nbPartition=10;
}elsif($ARGV[1]!~/^[0-9]+$/){
	print "Nombre de partition \"$ARGV[1]\" incorrect, quatité mise par défaut à\t10\n";
	$nbPartition=10;
}else{
	print "Nombre de partition mise à\t$ARGV[1]\n";
	$nbPartition=$ARGV[1];
}

print "chargement de l'index\n";
my %index = %{&p_index_manager::get_index($ARGV[0],$renewIndex)};

print "chargement des evals\n";
my %filesWithEval = %{&p_files_with_eval_manager::getFilesWithEval($ARGV[0],$nbPartition,$renewEval)};
#le format de %filesWithEval est un hash de tableau où une ligne :  note{-1..3} determinée?{0..1} nbPartition{0..($nbPartition-1)}

my $sommeTaux=0;
my $temps=time();
for my $paritionPourEvalutation (0..($nbPartition-1)){
	print "Evaluation sur\t$paritionPourEvalutation\n";
	#Apprentissage
	my %proba=();
	my @qteByClasse=();
	#my $sizeVocabulaire=keys(%index);
	for my $k (0..NB_CLASSE-1){
		$qteByClasse[$k]=0;
	}
	for my $klemme( keys(%index)){
		my %hDoc = %{$index{$klemme}};
		$proba{$klemme}=[1];
		for my $k (0..NB_CLASSE-1){
			$proba{$klemme}[$k]=1.1;
		}
		
		#my $totalMots;
		for my $kdoc (keys(%hDoc)){
			#si c'est pas un document dans celui utilisé pour le test, et qu'il a une note
			if($filesWithEval{$kdoc}[2]!=$paritionPourEvalutation && $filesWithEval{$kdoc}[0]!=-1){
				#on addition à la classe du document pour le klemme le nombre de fois qu'il est dans le document
				$proba{$klemme}[$filesWithEval{$kdoc}[0]]+=$hDoc{$kdoc};
				#$totalMots+=$hDoc{$kdoc};
			}
		}
		#ici reste l'ancienne normalisation qui donnais de mauvais résultats.
		#print "$klemme($totalMots) :\t$proba{$klemme}[0]\t$proba{$klemme}[1]\t$proba{$klemme}[2]\t$proba{$klemme}[3]\n";
		#for my $k (0..NB_CLASSE-1){
		#	$proba{$klemme}[$k]/=$totalMots;
		#	#$proba{$klemme}[$k]=log($proba{$klemme}[$k]/$totalMots);
		#}
		#print "$klemme($totalMots) :\t$proba{$klemme}[0]\t$proba{$klemme}[1]\t$proba{$klemme}[2]\t$proba{$klemme}[3]\n";
	}
	
	#normalisation 1/2 : comptage par classe
	for my $klemme(keys(%proba)){
		for my $k (0..NB_CLASSE-1){
			$qteByClasse[$k]+=$proba{$klemme}[$k];
		}
	}
	
	#normalisation 2/2 : division
	for my $klemme(keys(%proba)){
		for my $k (0..NB_CLASSE-1){
      $proba{$klemme}[$k]/=$qteByClasse[$k];
		}
	}

	#Evaluation des résultats
	my $nbEssai=0;
	my $nbReussite=0;
	my %probaDoc=();
	for my $klemme( keys(%index)){
		#print "$klemme :\t$proba{$klemme}[0]\t$proba{$klemme}[1]\t$proba{$klemme}[2]\t$proba{$klemme}[3]\n";
		my %hDoc = %{$index{$klemme}};
		for my $kdoc (keys(%hDoc)){
			#si c'est un document utilisé pour le test
			if($filesWithEval{$kdoc}[2]==$paritionPourEvalutation){
				if(!exists($probaDoc{$kdoc})){
					for my $k (0..NB_CLASSE-1){
						$probaDoc{$kdoc}[$k]=0;
					}
				}
				#on addition les probas de ses mots
				for my $k (0..NB_CLASSE-1){
					$probaDoc{$kdoc}[$k]+=log($proba{$klemme}[$k]);
				}
			}
		}
	}
	
	$nbEssai=keys(%probaDoc);
	my $toto;
	#analyse des résultats
	for my $kdoc( keys(%probaDoc)){
		$toto=&where_is_the_max($probaDoc{$kdoc});
		if($toto==$filesWithEval{$kdoc}[0]){
			$nbReussite++;
		}elsif($filesWithEval{$kdoc}[0]==-1){
			$nbEssai--;
		}
	}
	
	if($nbEssai==0){
		print "le corpus était trop petit par rapport au nombre de paritionnement, en prenant ~10% du corpus nous avons prit 0 fichier.\n";
	}else{
		print "Taux de réussite : $nbReussite/$nbEssai soit\t" . int($nbReussite/$nbEssai*100) . "%\n";
		$sommeTaux+=$nbReussite/$nbEssai*100;
	}
}
print "Taux de réussite moyen :\t" . int(1000*$sommeTaux/$nbPartition)/1000 . "%\ten\t" . (time()-$temps) . " secondes\n";










